<?php
namespace Exam\Object;

use Tsy\Library\Object;
/**
 * 试题
 * 
 * @package Exam\Object
 */
class QuestionObject extends Object
{
    /**

     * 试题ID SID int(11) 自增 主键 必填  
     * 科目ID KID int(11)   必填  
     * 题目难度ID TLID int(11)   必填  
     * 题干 Title varchar(2000)     
     * 参考答案 Answer varchar(2000)     
     * 分数 Score int(11)   必填  
     * 题目类型ID TTID int(11)   必填  
     */
    /**
     * @var string
     */
    protected $main='Question';
    protected $pk='SID';
    public $addFields=['KID','TLID','Title','Answer','Score','TTID','ZSDID','FID'];//允许添加的字段，如果数组最后一个元素值为true则表示排除
    public $saveFields=['KID','TLID','Title','Answer','Score','TTID','ZSDID','FID'];//允许修改的字段，如果数组最后一个元素值为true则表示排除
    public $addFieldsConfig=[
    
//      'KID'=>[//字段名称:科目ID,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 科目ID(KID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 科目ID(KID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 科目ID(KID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 科目ID(KID) 的值是否存在，取该值或该函数的值
//      ],

//      'TLID'=>[//字段名称:题目难度ID,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 题目难度ID(TLID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题目难度ID(TLID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题目难度ID(TLID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题目难度ID(TLID) 的值是否存在，取该值或该函数的值
//      ],

//      'Title'=>[//字段名称:题干,数据类型:varchar(2000),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 题干(Title) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题干(Title) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题干(Title) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题干(Title) 的值是否存在，取该值或该函数的值
//      ],

//      'Answer'=>[//字段名称:参考答案,数据类型:varchar(2000),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 参考答案(Answer) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 参考答案(Answer) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 参考答案(Answer) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 参考答案(Answer) 的值是否存在，取该值或该函数的值
//      ],

//      'Score'=>[//字段名称:分数,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 分数(Score) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 分数(Score) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 分数(Score) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 分数(Score) 的值是否存在，取该值或该函数的值
//      ],

//      'TTID'=>[//字段名称:题目类型ID,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 题目类型ID(TTID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题目类型ID(TTID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题目类型ID(TTID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题目类型ID(TTID) 的值是否存在，取该值或该函数的值
//      ]
//        'FID'=>[//一道大题，可能里面包含有若干个小题目
//            self::FIELD_CONFIG_DEFAULT=>'1',//当 题目类型ID(TTID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题目类型ID(TTID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题目类型ID(TTID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题目类型ID(TTID) 的值是否存在，取该值或该函数的值
//      ]
    ];
    public $saveFieldsConfig=[
    
//      'KID'=>[//字段名称:科目ID,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 科目ID(KID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 科目ID(KID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 科目ID(KID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 科目ID(KID) 的值是否存在，取该值或该函数的值
//      ],

//      'TLID'=>[//字段名称:题目难度ID,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 题目难度ID(TLID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题目难度ID(TLID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题目难度ID(TLID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题目难度ID(TLID) 的值是否存在，取该值或该函数的值
//      ],

//      'Title'=>[//字段名称:题干,数据类型:varchar(2000),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 题干(Title) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题干(Title) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题干(Title) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题干(Title) 的值是否存在，取该值或该函数的值
//      ],

//      'Answer'=>[//字段名称:参考答案,数据类型:varchar(2000),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 参考答案(Answer) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 参考答案(Answer) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 参考答案(Answer) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 参考答案(Answer) 的值是否存在，取该值或该函数的值
//      ],

//      'Score'=>[//字段名称:分数,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 分数(Score) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 分数(Score) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 分数(Score) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 分数(Score) 的值是否存在，取该值或该函数的值
//      ],

//      'TTID'=>[//字段名称:题目类型ID,数据类型:int(11),注释:
//            self::FIELD_CONFIG_DEFAULT=>'null',//当 题目类型ID(TTID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_DEFAULT_FUNCTION=>'null',//当 题目类型ID(TTID) 的值不存在时，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE=>'null',//不管 题目类型ID(TTID) 的值是否存在，取该值或该函数的值,
//            self::FIELD_CONFIG_VALUE_FUNCTION=>'null',//不管 题目类型ID(TTID) 的值是否存在，取该值或该函数的值
//      ]
    ];
    protected $property=[
        'Titlelevel'=>[//题目难度ID  题目难度  属性
            self::RELATION_TABLE_NAME=>'Titlelevel',//属性关联表
            self::RELATION_TABLE_COLUMN=>'TLID',//关联表中的关联字段
            self::RELATION_MAIN_COLUMN=>'TLID',//主笔中的关联字段
            self::RELATION_TABLE_PROPERTY=>self::PROPERTY_ONE_OBJECT,
        ],
        'Discipline'=>[//科目ID  科目  属性
            self::RELATION_TABLE_NAME=>'Discipline',//属性关联表
            self::RELATION_TABLE_COLUMN=>'KID',//关联表中的关联字段
            self::RELATION_MAIN_COLUMN=>'KID',//主笔中的关联字段
            self::RELATION_TABLE_PROPERTY=>self::PROPERTY_ONE_OBJECT,
        ],
        'Titletype'=>[//题目类型ID  题目类型  属性
            self::RELATION_TABLE_NAME=>'Titletype',//属性关联表
            self::RELATION_TABLE_COLUMN=>'TTID',//关联表中的关联字段
            self::RELATION_MAIN_COLUMN=>'TTID',//主笔中的关联字段
            self::RELATION_TABLE_PROPERTY=>self::PROPERTY_ONE,            
        ],
        'QuestionOption'=>[//题目类型ID  题目类型  属性
            self::RELATION_TABLE_NAME=>'question_option',//属性关联表
            self::RELATION_TABLE_COLUMN=>'SID',//关联表中的关联字段
            self::RELATION_MAIN_COLUMN=>'SID',//主笔中的关联字段
            self::RELATION_TABLE_PROPERTY=>self::PROPERTY_ARRAY,
        ],


    ];
    protected $link=[
       
    ];
    protected $searchFields=['SID','KID','TLID','Title','Answer','Score','TTID','FID','CID','ZID'];
    protected $searchTable='Question';
    protected $searchWFieldsConf=[
        'Question'=>'Question',        
    ];
    protected $searchWFieldsGroup=[
        'Question'=>['SID','KID','TLID','Title','Answer','Score','TTID','FID'],


    ];

    /**
     * 判断试题是否存在
     * @param $data
     * @return bool
     */
    function judgeExists($data){
        if($data['questions']!=null)
        {
            $question=M('question');
            foreach($data['questions'] as $ndata)
            {
                $condition=[
                    'KID'=>$ndata['KID'],
                    'TLID'=>$ndata['TLID'],
                    'Title'=>$ndata['Title'],
                    'Answer'=>$ndata['Answer'],
                    'Score'=>$ndata['Score'],
                    'TTID'=>$ndata['TTID'],
                    'ZSDID'=>$ndata['ZSDID']
                ];
                $exits = $question->where($condition)->find();
                if (!is_array($exits)) {
                    return false;
                }
            }
            $option = M('question_option');
            foreach($data['questions'] as $mdata) {
                if($mdata['options']!=null) {
                    $options=$mdata['options'];
                    foreach($options as $op) {
                        $condition[]=[
                            'content'=>$op['content']
                        ];
                    }
                    $exits=$option->select($condition);
                    if(is_array($exits))
                    {
                        return true;
                    }
                }
            }
        }
        else if($data['TTID']!=2 && $data['TTID']!=3) {
            $question=M('question');
            $condition=[
                'KID'=>$data['KID'],
                'TLID'=>$data['TLID'],
                'Title'=>$data['Title'],
                'Answer'=>$data['Answer'],
                'Score'=>$data['Score'],
                'TTID'=>$data['TTID'],
                'ZSDID'=>$data['ZSDID']
            ];
            $exits = $question->where($condition)->find();
            if (is_array($exits)) {
                return true;
            }
        }
        else{
            $option=M('question_option');
            $options=$data['options'];
            foreach($options as $op)
            {
                $condition[]=[
                    'content'=>$op['content']
                ];
            }
            $exits=$option->select($condition);
            if(is_array($exits))
            {
                return true;
            }
        }
    }
    /**
     * @param array $data  如果是选择题，则data里面应该有
     * options[['A',0],['B',1]....],如果没有这些数据，则会报错。
     * @param bool $Properties
     * @param bool $OnlyPK
     * @return array|bool|mixed|string]
     */

    function add($data = [], $Properties = false, $OnlyPK = false)
    {
        $data=array_merge($data,$_POST);
        if ($this->judgeExists($data)){
            return "该题已经存在，请勿重新添加";
        }
        //如果添加的试题不是单选题或者多选题的话
        if ($data['TTID']!=2 && $data['TTID']!=3 )
        {
            return parent::add($data, $Properties, $OnlyPK);
        }
        else {
            if ($data['options'] == null){
                return '请给出选择题的选项';
            }
            $options = $data['options'];
            unset($data['options']);
            startTrans();
            $result = parent::add($data,false,false);
            if ($result){
                $addOption = [
                    'SID'=>$result['SID'],
                ];
                foreach ($options as $value){
                    $addOption['content'] = $value['content'];
                    $addOption['isright'] = $value['isright'];
                    if (M('question_option')->add($addOption) == false){
                        rollback();
                        return false;
                    }
                }
                commit();
                return $this->get($result['SID']);
            }else{
                rollback();
                return "添加失败";
            }
        }
    }

    /**
     *添加大题
     * @param array $questions 默认数组里面第一个题是题目描述。剩下的题全是这个大题里面的小题。
     *
     */
    function addDt($questions=[]){
        if (count($questions)<1){
            return "数据传入有误";
        }
        startTrans();
        $result = $this->add($questions[0]);
        if ($result['SID'] != null){
            for($i=1; $i<count($questions); $i++){
                $questions[$i]['FID'] = $result['SID'];
                if ($this->add($questions[$i])){
                    continue;
                }
                rollback();
                return "添加子题目时失败";
            }
            commit();
            return "test".$this->get($result['SID']);
        }
       return '添加大题题目失败';
    }

    function getCountByID($data=[]){
//        return M('Question')->where("KID=$KID")->field('count(KID) AS sum')->select();

        $data = array_merge($data,$_POST);
        $ID = $data['ID'];
        $name = $data['Name'];
        $test =  M('Question')->where("$name=$ID")->field("$name,count($name) AS sum")->select();
        if (is_array($test) && count($test) == 1){
            return $test[0];
        }
        return $test;
    }

    function get($ID = false)
    {
        $result =  parent::get($ID); // TODO: Change the autogenerated stub
        if ($result['TTID'] == 4){
            $FID = $result['SID'];
            $result['subQuestion'] = M('Question')->where("FID=$FID")->field('SID')->select();
            for ($i=0; $i<count($result['subQuestion']); $i++){
                $result['subQuestion'][$i] = parent::get($result['subQuestion'][$i]['SID']);
//                $temp =  parent::get($result['subQuestion'][$i]['SID']);
            }
        }
        return $result;
    }

}